package vip.liux.contracts.security.core.extensions;

import lombok.Getter;

/**
 * 表示登录结果的类。
 * <p>包含登录操作的结果状态。</p>
 */
@Getter
public class SignInResult {

    /**
     * 表示登录成功的结果。
     */
    private static final SignInResult SUCCESS = new SignInResult(true, false, false, false);

    /**
     * 表示登录失败的结果。
     */
    private static final SignInResult FAILED = new SignInResult(false, false, false, false);

    /**
     * 表示账户被锁定的结果。
     */
    private static final SignInResult LOCKED_OUT = new SignInResult(false, true, false, false);

    /**
     * 表示登录不被允许的结果。
     */
    private static final SignInResult NOT_ALLOWED = new SignInResult(false, false, true, false);

    /**
     * 表示需要双因素认证的结果。
     */
    private static final SignInResult TWO_FACTOR_REQUIRED = new SignInResult(false, false, false, true);

    /**
     * 是否登录成功。
     */
    private final boolean succeeded;

    /**
     * 是否账户被锁定。
     */
    private final boolean isLockedOut;

    /**
     * 是否登录不被允许。
     */
    private final boolean isNotAllowed;

    /**
     * 是否需要双因素认证。
     */
    private final boolean requiresTwoFactor;

    /**
     * 默认构造方法。
     * <p>初始化为所有状态为 false。</p>
     */
    public SignInResult() {
        this(false, false, false, false);
    }

    /**
     * 私有构造方法。
     *
     * @param succeeded         是否登录成功
     * @param isLockedOut       是否账户被锁定
     * @param isNotAllowed      是否登录不被允许
     * @param requiresTwoFactor 是否需要双因素认证
     */
    private SignInResult(boolean succeeded, boolean isLockedOut, boolean isNotAllowed, boolean requiresTwoFactor) {
        this.succeeded = succeeded;
        this.isLockedOut = isLockedOut;
        this.isNotAllowed = isNotAllowed;
        this.requiresTwoFactor = requiresTwoFactor;
    }

    /**
     * 获取登录成功的结果。
     *
     * @return 登录成功的结果
     */
    public static SignInResult success() {
        return SUCCESS;
    }

    /**
     * 获取登录失败的结果。
     *
     * @return 登录失败的结果
     */
    public static SignInResult failed() {
        return FAILED;
    }

    /**
     * 获取账户被锁定的结果。
     *
     * @return 账户被锁定的结果
     */
    public static SignInResult lockedOut() {
        return LOCKED_OUT;
    }

    /**
     * 获取登录不被允许的结果。
     *
     * @return 登录不被允许的结果
     */
    public static SignInResult notAllowed() {
        return NOT_ALLOWED;
    }

    /**
     * 获取需要双因素认证的结果。
     *
     * @return 需要双因素认证的结果
     */
    public static SignInResult twoFactorRequired() {
        return TWO_FACTOR_REQUIRED;
    }

    /**
     * 返回登录结果的字符串表示。
     *
     * @return 登录结果的字符串表示
     */
    @Override
    public String toString() {
        if (isLockedOut) return "LockedOut";
        if (isNotAllowed) return "NotAllowed";
        if (requiresTwoFactor) return "RequiresTwoFactor";
        if (succeeded) return "Succeeded";
        return "Failed";
    }
}